/* This code was extracted from an internal test tool which was compiled in */
/* Microsoft C++ 1.52C (16 bit) or Microsoft Visual C++ 5 (32-bit).         */
/* This snippet has not been tested and does not carry a warranty by        */
/* Motorola of any kind. AS IS. Use at your own risk.                       */

#include <Windows.h>

#define THIRTY_TWO_BIT   0
/* You'll need to set the value of THIRTY_TWO_BIT to 0 or 1 depending on */
/* whether your compiling as 32bit or 16bit. */

#if THIRTY_TWO_BIT
	#define kNameOfHwEvntDLL			"HWEVNT32.DLL"
#else
	#define kNameOfHwEvntDLL			"HWEVNT.DLL"
#endif

#define kNameOfRegisterEmgRoutine	"Register_Emg"
#define kNameOfDeregisterEmgRoutine	"DeRegister_Emg"

typedef WORD (WINAPI *REGISTER)(HWND, UINT);
typedef WORD (WINAPI *DEREGISTER)(HWND);

#define EMG_SUCCESS   1              
#define MM_EMERGENCY  12345  /* Or whatever message number you'd like to use */

HINSTANCE gMW520LibraryInstanceHandle = NULL;

BOOL gMW520LibraryLoaded = FALSE;
BOOL gMW520EmergencyRegistered = FALSE;


void ConnectToMW520Routines ( void )
{
	if ( gMW520LibraryLoaded == FALSE )
	{   
		gMW520LibraryInstanceHandle = LoadLibrary ( kNameOfHwEvntDLL );

		if ( gMW520LibraryInstanceHandle <= (HINSTANCE) HINSTANCE_ERROR )
		{
			gMW520LibraryInstanceHandle = NULL;
		}

		if ( gMW520LibraryInstanceHandle == NULL )
		{
			/* Not a Motorola MW-520 */
		}
        	else
		{
			gMW520LibraryLoaded = TRUE;
			
			/* Loaded, but emergency not registered yet */
		}
	}
}

void DisconnectFromMW520Routines ( void )
{
	if ( gMW520LibraryLoaded != FALSE )
	{	
		if ( gMW520LibraryInstanceHandle != NULL )
		{
			FreeLibrary ( gMW520LibraryInstanceHandle );
			
			gMW520LibraryInstanceHandle = NULL;

			gMW520LibraryLoaded = FALSE;
		}
	}
}


void RegisterForMW520Emergency ( HWND currentWindowHandle )
{
	REGISTER RegisterEmergencyProcedurePointer = NULL;

	if ( gMW520LibraryLoaded != FALSE && gMW520LibraryInstanceHandle != NULL )
	{
		RegisterEmergencyProcedurePointer = (REGISTER) GetProcAddress ( gMW520LibraryInstanceHandle, kNameOfRegisterEmgRoutine );
			
		if ( RegisterEmergencyProcedurePointer == NULL )
		{
			/* Couldn't find the routine */
		}
		else
		{
      			if ( RegisterEmergencyProcedurePointer ( currentWindowHandle, MM_EMERGENCY ) != EMG_SUCCESS )
			{
				/* Emergency registration FAILED */
			}
			else
	        	{
				gMW520EmergencyRegistered = TRUE;
						
				/* Emergency registered */
			}
		}
	}
}

void DeregisterForMW520Emergency ( HWND currentWindowHandle )
{
	DEREGISTER DeregisterEmergencyProcedurePointer = NULL;

	if ( gMW520EmergencyRegistered != FALSE && gMW520LibraryInstanceHandle != NULL )
	{   
		DeregisterEmergencyProcedurePointer = (DEREGISTER) GetProcAddress ( gMW520LibraryInstanceHandle, kNameOfDeregisterEmgRoutine );
				
		if ( DeregisterEmergencyProcedurePointer == NULL )
		{
			/* Deregister function not found */
		}
		else
		{
			if ( DeregisterEmergencyProcedurePointer ( currentWindowHandle ) != EMG_SUCCESS )
			{
				/* Emergency deregistration FAILED!! */
			}
			else
			{
				gMW520EmergencyRegistered = FALSE;
						
				/* Emergency deregistered */
			}
		}
	}
}



void main ( void )
{
	HWND yourWindow = NULL;

	/* Create your window and assign it to yourWindow */

	/* Somewhere in the beginning of your main startup, you'd then call these routines */

	ConnectToMW520Routines ( );
	RegisterForMW520Emergency ( yourWindow );


	/* Somewhere in your window event switch statement you'd place this code */
	/* to receive the emergency message. */

	
	case MM_EMERGENCY:
		if ( gMW520EmergencyRegistered != FALSE )
		{
			/* The MW-520 emergency button was just pressed */
		}
		break;
	

	/* Somewhere towards the end of your main shutdown, you'd call these routines */

	DeregisterForMW520Emergency ( yourWindow );
	DisconnectFromMW520Routines ( );
}